package com.zdw.template.config.exception;

import com.zdw.common.exception.GlobalException;
import com.zdw.common.parent.JSONResult;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.text.MessageFormat;
import java.util.LinkedList;

/**
 * Sa-Token全局异常拦截
 */
@SuppressWarnings("all")
@RestControllerAdvice(basePackages = {"com.zdw.warehouse.controller"})    //只拦截controller,防止业务层异常被拦截,从而导致seata分布式事务失效
public class GlobalExceptionHandler {

    /**
     * ValidateException异常拦截(不走Sa-Token)
     * (注意:其他异常拦截需要在Exception拦截之前,否则不会生效)
     *
     * @param e
     * @return
     */
    /*@ExceptionHandler({ValidateException.class})
    public JSONResult handlerException(ValidateException e) {
        e.printStackTrace();
        return new JSONResult().markFail(e.getMessage());
    }*/

    /**
     * GlobalException自定义全局异常拦截
     * (注意:其他异常拦截需要在Exception拦截之前,否则不会生效)
     *
     * @param e
     * @return
     */
    /*@ExceptionHandler({GlobalException.class})
    public JSONResult handlerException(GlobalException e) {
        //匹配异常中的返回参数，并按顺序自动填充到异常信息中
        String formattedMsg = formatMessage(e.getMsg(), e.getParams());
        e.printStackTrace();
        return new JSONResult().markFail(formattedMsg);
    }*/

    /**
     * 全局异常拦截(Sa-Token)
     * (注意:其他异常拦截需要在Exception拦截之前,否则不会生效)
     *
     * @param e
     * @return
     */
    /*@ExceptionHandler
    public SaResult handlerException(Exception e) {
        e.printStackTrace();
        return SaResult.error(e.getMessage());
    }*/

    /**
     * 格式化消息字符串，并按顺序替换其中的参数占位符{0}、{1}、{2}等
     * 如果没有提供参数或参数为空，则直接返回原始消息字符串
     *
     * @param message 消息模板字符串，包含参数占位符
     * @param params  参数列表，用于替换消息模板中的占位符
     * @return 格式化后的消息字符串
     */
    private String formatMessage(String message, LinkedList<String> params) {
        if (params == null || params.isEmpty()) {
            return message;
        }
        Object[] paramsArray = params.toArray(new String[0]);
        return MessageFormat.format(message, paramsArray);
    }

}
